package org.javahispano.javacup.tacticas_aceptadas.cmoncada.tacticaconcurso;

import java.awt.Color;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import org.javahispano.javacup.modelo.ComandoGolpearBalon;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.EstiloUniforme;
import org.javahispano.javacup.modelo.JugadorDetalle;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;
import org.javahispano.javacup.modelo.Tactica;
import org.javahispano.javacup.modelo.TacticaDetalle;

public class TacticaCaldera implements Tactica {
	
	//Normal			
	 	Posicion alineacion1[]=new Posicion[]{
		        new Posicion(0.2595419847328244,-50.41044776119403),
		        new Posicion(-28.055944055944057,-27.31900452488688),
		        new Posicion(-9.986013986013985,-31.357466063348415),
		        new Posicion(10.937062937062937,-31.59502262443439),
		        new Posicion(28.531468531468533,-26.606334841628957),
		        new Posicion(13.552447552447552,-11.402714932126697),
		        new Posicion(-12.363636363636363,-11.402714932126697),
		        new Posicion(16.88111888111888,41.0972850678733),
		        new Posicion(0.23776223776223776,35.63348416289593),
		        new Posicion(0.4755244755244755,18.054298642533936),
		        new Posicion(-15.93006993006993,39.19683257918552)
		    };
	
	
	//Inicia Sacando
		Posicion alineacion2[]=new Posicion[]{
	        new Posicion(0.2595419847328244,-50.41044776119403),
	        new Posicion(-11.16030534351145,-35.78358208955224),
	        new Posicion(12.717557251908397,-35.26119402985075),
	        new Posicion(28.290076335877863,-28.470149253731343),
	        new Posicion(-28.290076335877863,-28.470149253731343),
	        new Posicion(14.793893129770993,-18.544776119402986),
	        new Posicion(-17.389312977099234,-19.58955223880597),
	        new Posicion(-23.618320610687025,-0.7835820895522387),
	        new Posicion(5.969465648854961,-5.485074626865671),
	        new Posicion(0.2595419847328244,-0.26119402985074625),
	        new Posicion(22.580152671755727,-1.3059701492537314)
	    };
	    
	
		//Inicia Recibiendo
		Posicion alineacion3[]=new Posicion[]{
	        new Posicion(0.2595419847328244,-50.41044776119403),
	        new Posicion(-11.16030534351145,-35.78358208955224),
	        new Posicion(12.717557251908397,-35.26119402985075),
	        new Posicion(28.290076335877863,-28.470149253731343),
	        new Posicion(-28.290076335877863,-28.470149253731343),
	        new Posicion(14.793893129770993,-18.544776119402986),
	        new Posicion(-17.389312977099234,-19.58955223880597),
	        new Posicion(-23.618320610687025,-0.7835820895522387),
	        new Posicion(6.4885496183206115,-6.529850746268657),
	        new Posicion(-6.4885496183206115,-6.529850746268657),
	        new Posicion(22.580152671755727,-1.3059701492537314)
	    };
	   

    class TacticaDetalleImpl implements TacticaDetalle {

        public String getNombre() {
            return "caldera";
        }

        public String getPais() {
            return "Colombia";
        }

        public String getEntrenador() {
            return "Cesar Moncada";
        }

        public Color getColorCamiseta() {
            return new Color(69, 126, 76);
        }

        public Color getColorPantalon() {
            return new Color(255, 255, 255);
        }

        public Color getColorFranja() {
            return new Color(255, 255, 255);
        }

        public Color getColorCalcetas() {
            return new Color(100, 136, 115);
        }

        public Color getColorPortero() {
            return new Color(155, 185, 157        );
        }

        public EstiloUniforme getEstilo() {
            return EstiloUniforme.LINEAS_VERTICALES;
        }

        public Color getColorCamiseta2() {
            return new Color(5, 12, 25);
        }

        public Color getColorPantalon2() {
            return new Color(234, 141, 116);
        }

        public Color getColorFranja2() {
            return new Color(165, 210, 163);
        }

        public Color getColorCalcetas2() {
            return new Color(48, 59, 177);
        }

        public Color getColorPortero2() {
            return new Color(143, 40, 147        );
        }

        public EstiloUniforme getEstilo2() {
            return EstiloUniforme.SIN_ESTILO;
        }

        class JugadorImpl implements JugadorDetalle {

            String nombre;
            int numero;
            Color piel, pelo;
            double velocidad, remate, presicion;
            boolean portero;
            Posicion posicion;

            public JugadorImpl(String nombre, int numero, Color piel, Color pelo,
                    double velocidad, double remate, double presicion, boolean portero) {
                this.nombre=nombre;
                this.numero=numero;
                this.piel=piel;
                this.pelo=pelo;
                this.velocidad=velocidad;
                this.remate=remate;
                this.presicion=presicion;
                this.portero=portero;
            }

            public String getNombre() {
                return nombre;
            }

            public Color getColorPiel() {
                return piel;
            }

            public Color getColorPelo() {
                return pelo;
            }

            public int getNumero() {
                return numero;
            }

            public boolean esPortero() {
                return portero;
            }

            public double getVelocidad() {
                return velocidad;
            }

            public double getRemate() {
                return remate;
            }

            public double getPresicion() {
                return presicion;
            }

        }
                               
        
        public JugadorDetalle[] getJugadores() {
            return new JugadorDetalle[]{
                new JugadorImpl("Portero", 1, new Color(255,200,150), new Color(50,0,0),0.85d,1.0d,1.0d, true),
                new JugadorImpl("marcador", 2, new Color(255,200,150), new Color(50,0,0),1.0d,0.7d,0.75d, false),
                new JugadorImpl("central", 3, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,0.97d, false),
                new JugadorImpl("central", 4, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,0.97d, false),
                new JugadorImpl("marcador", 5, new Color(255,200,150), new Color(50,0,0),1.0d,0.7d,0.75d, false),
                new JugadorImpl("volante", 6, new Color(255,200,150), new Color(50,0,0),1.0d,0.37d,0.24d, false),
                new JugadorImpl("Volante", 7, new Color(255,200,150), new Color(50,0,0),1.0d,0.37d,0.23d, false),
                new JugadorImpl("Delantero", 8, new Color(255,200,150), new Color(50,0,0),1.0d,0.65d,1.0d, false),
                new JugadorImpl("Delantero", 9, new Color(255,200,150), new Color(50,0,0),1.0d,0.65d,1.0d, false),
                new JugadorImpl("armador", 10, new Color(255,200,150), new Color(50,0,0),1.0d,0.65d,1.0d, false),
                new JugadorImpl("Delantero", 11, new Color(255,200,150), new Color(50,0,0),1.0d,0.65d,1.0d, false)
            };
        }
    }

    TacticaDetalle detalle=new TacticaDetalleImpl();
    public TacticaDetalle getDetalle() {
        return detalle;
    }

    public Posicion[] getPosicionSaca(SituacionPartido sp) {
    return alineacion2;
    }

    public Posicion[] getPosicionRecive(SituacionPartido sp) {
    return alineacion3;
    }

    public List ejecutar(SituacionPartido sp) {

        Posicion posicionesMiEquipo[] = sp.misJugadores();
        Posicion posicionesRival[] = sp.rivales();
        int jugadorPuedeRematar[] = sp.puedenRematar();
        int jugadorMasCercaBalon[] = sp.balon().indicesMasCercanos(posicionesMiEquipo);
        int golesMiEquipo = sp.golesPropios();
        int golesRival = sp.golesRival();
        int iteraciones = sp.iteracion();
        boolean tacticaDefensiva= golesMiEquipo-golesRival>4;
                
        LinkedList comandos = new LinkedList();
       
        for(int i = 1; i < 11; i++) {
            double y = posicionesRival[i].getY();
            double x = posicionesRival[i].getX();
            if(iteraciones<2400){
	            if(i>(golesMiEquipo>=golesRival?
	            		(golesMiEquipo-golesRival>4?0:4):
	            			(golesRival-golesMiEquipo>1?6:4))){
		            if(sp.balon().getY() < y) y -= 2;
		            	else y += 2;
		            if(sp.balon().getX() < x) x -= 2;
		            	else x += 2;
	            }else{            	            	
	            	x = alineacion1[11-i].getX();
	            	y = alineacion1[11-i].getY();
	            	
	            }
            }else{
            	if((golesMiEquipo==golesRival)||(golesRival-golesMiEquipo>0)){
            		if(i>6){
    		            if(sp.balon().getY() < y) y -= 2;
    		            	else y += 2;
    		            if(sp.balon().getX() < x) x -= 2;
    		            	else x += 2;
    	            }else{            	            	
    	            	x = alineacion1[11-i].getX();
    	            	y = alineacion1[11-i].getY();    	            	
    	            }
            	}else{
            		if(i>(golesMiEquipo>=golesRival?
    	            		(golesMiEquipo-golesRival>2?0:4):
    	            			(golesRival-golesMiEquipo>0?6:4))){
    		            if(sp.balon().getY() < y) y -= 2;
    		            	else y += 2;
    		            if(sp.balon().getX() < x) x -= 2;
    		            	else x += 2;
    	            }else{            	            	
    	            	x = alineacion1[11-i].getX();
    	            	y = alineacion1[11-i].getY();
    	            	
    	            }
            	}
            	tacticaDefensiva = golesMiEquipo-golesRival>2;
            }
            comandos.add(new ComandoIrA(11-i, new Posicion(x, y)));            
        } 
        
        double max = Math.min(sp.balon().getX(), 3);
        max = Math.max(max, -3);
        comandos.add(new ComandoIrA(0, new Posicion(max, -50.5)));
        comandos.add(new ComandoIrA(jugadorMasCercaBalon[0], sp.balon()));        
                                
        if(iteraciones<2400){
            if(golesMiEquipo>=golesRival){
            	if(golesMiEquipo-golesRival>4){
            		comandos.add(new ComandoIrA(jugadorMasCercaBalon[1], sp.balon()));
            	}else{
            		if(jugadorMasCercaBalon[1]<8){
                    	comandos.add(new ComandoIrA(jugadorMasCercaBalon[1], sp.balon()));
                    }
            	}
            }else{
            	if(golesRival-golesMiEquipo>2){
            		comandos.add(new ComandoIrA(jugadorMasCercaBalon[1], sp.balon()));
            	}else{
            		if(jugadorMasCercaBalon[1]<8){
                    	comandos.add(new ComandoIrA(jugadorMasCercaBalon[1], sp.balon()));
                    }
            	}
            }
        }else{
        	if((golesMiEquipo==golesRival)||(golesRival-golesMiEquipo>0)){
        		comandos.add(new ComandoIrA(jugadorMasCercaBalon[1], sp.balon()));
        	}else{
        		if(golesMiEquipo-golesRival>2){
        			comandos.add(new ComandoIrA(jugadorMasCercaBalon[1], sp.balon()));
        		}else{
        			if(jugadorMasCercaBalon[1]<8){
                    	comandos.add(new ComandoIrA(jugadorMasCercaBalon[1], sp.balon()));
                    }
        		}
        	}
        }
        	                             

        for(int i: jugadorPuedeRematar) {
         
          double disRematadorCentroArco = posicionesMiEquipo[i].distancia(Constantes.centroArcoSup);          
          
          double disArqRivalPosDer =posicionesRival[0].distancia(Constantes.posteDerArcoSup);                
          double disArqRivalPosIzq =posicionesRival[0].distancia(Constantes.posteDerArcoSup);          
          
          double dis10CornerDer = posicionesMiEquipo[9].distancia(Constantes.cornerSupDer);
          double dis10CornerIzq = posicionesMiEquipo[9].distancia(Constantes.cornerSupIzq);
          
          double disRematadorArqueroRival = posicionesMiEquipo[i].distancia(posicionesRival[0]);
          
          double disDel11rArqueroRival = posicionesMiEquipo[10].distancia(posicionesRival[0]);
          double disDel08ArqueroRival = posicionesMiEquipo[7].distancia(posicionesRival[0]);
          double disDel09rArqueroRival = posicionesMiEquipo[8].distancia(posicionesRival[0]);                              
                    
          if(!tacticaDefensiva){
	          if(i<7 && disRematadorCentroArco>18){        	  
	        		  comandos.add(new ComandoGolpearBalon(i, posicionesMiEquipo[9], 
	        				  i>0?fuerzaPase(posicionesMiEquipo[i],posicionesMiEquipo[9],"A_ARMADOR"):1, true));        	  
	          }else{  
	        	  Posicion posRemate = Constantes.centroArcoSup;
	        	  if(disRematadorCentroArco<20){	        		  
	        		  if(disRematadorArqueroRival>12){
		        		  double distanciaMueveCentro =18-disRematadorCentroArco;
				          if(disArqRivalPosDer>disArqRivalPosIzq){
				        	  if(disRematadorCentroArco>8)
				        		  posRemate.moverPosicion(12-distanciaMueveCentro, 12- distanciaMueveCentro);
				        	  else
				        		  posRemate=Constantes.posteDerArcoSup;			        	  
				        	  comandos.add(new ComandoGolpearBalon(i, posRemate, fuerzaRemateArco(disRematadorCentroArco), 
				        			  anguloRemateArco(disRematadorCentroArco)));			        	  
				          }else{
				        	  if(disRematadorCentroArco>10)
				        		  posRemate.moverPosicion(12-distanciaMueveCentro, 12-distanciaMueveCentro);
				        	  else
				        		  posRemate=Constantes.posteIzqArcoSup;
				        	  
				        	  comandos.add(new ComandoGolpearBalon(i, posRemate, fuerzaRemateArco(disRematadorCentroArco), anguloRemateArco(disRematadorCentroArco)));			        	  
				          }
	        		  }else{	        			          			    
	        			  if(i==8){
	        				  comandos.add(new ComandoGolpearBalon(i, 
	        						  disDel11rArqueroRival>disDel08ArqueroRival?posicionesMiEquipo[10]:posicionesMiEquipo[7],
	        								  fuerzaPase(posicionesMiEquipo[8], disDel11rArqueroRival>disDel08ArqueroRival?posicionesMiEquipo[10]:
	        									  posicionesMiEquipo[7], "ATRAS"), 10));
	        			  }else if(i==7){
	        				  comandos.add(new ComandoGolpearBalon(i, 
	        						  disDel09rArqueroRival>disDel11rArqueroRival?posicionesMiEquipo[8]:posicionesMiEquipo[10],
	        								  fuerzaPase(posicionesMiEquipo[7], disDel09rArqueroRival>disDel11rArqueroRival?posicionesMiEquipo[8]:
	        									  posicionesMiEquipo[10], "ATRAS"), disDel09rArqueroRival>disDel11rArqueroRival?10:25));
	        			  }else if(i==10){
	        				  comandos.add(new ComandoGolpearBalon(i, 
	        						  disDel09rArqueroRival>disDel08ArqueroRival?posicionesMiEquipo[8]:posicionesMiEquipo[7], 
	        								  fuerzaPase(posicionesMiEquipo[10], disDel09rArqueroRival>disDel08ArqueroRival?posicionesMiEquipo[8]:
	        									  posicionesMiEquipo[7], "ATRAS"), disDel09rArqueroRival>disDel08ArqueroRival?10:25));
	        			  }else{
	        				  if(i!=jugadorMasCercaBalon[0])
	            				  comandos.add(new ComandoGolpearBalon(i, jugadorMasCercaBalon[1], 0.8, 45));
	            			  else
	            				  comandos.add(new ComandoGolpearBalon(i, jugadorMasCercaBalon[0], 0.8, 45)); 
	        			  }
	        		  }
	        	  }else{
	        		 if(i==9){
	        			 if(disRematadorCentroArco<40){	        			 
	        				 if(dis10CornerDer<dis10CornerIzq){
	        					 comandos.add(new ComandoGolpearBalon(i, Constantes.cornerSupDer, 
	        							 fuerzaPase(posicionesMiEquipo[9],posicionesMiEquipo[7],"CORNER"), 40));
		        			 	 comandos.add(new ComandoIrA(7, Constantes.cornerSupDer));
	        				 }else{
	        					 comandos.add(new ComandoGolpearBalon(i, Constantes.cornerSupIzq, 
	        							 fuerzaPase(posicionesMiEquipo[9],posicionesMiEquipo[10],"CORNER"), 40));
		        			 	 comandos.add(new ComandoIrA(10, Constantes.cornerSupIzq));
	        				 }
	        			 }else{
	        				 Random r = new Random();
	                	     double f = r.nextDouble() * 0.2 + 0.8;
	        				 comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, f, true)); 
	        			 }	        			 
	        		 }else{
	        			 if(disRematadorCentroArco<50 && i!=7 && i!=10){
	        				 comandos.add(new ComandoGolpearBalon(i));
	        			 }else{        				       				 
	        				 comandos.add(new ComandoGolpearBalon(i, posicionesMiEquipo[disRematadorCentroArco>30?8:10], 
	        						 disRematadorCentroArco>30?1:0.8, disRematadorCentroArco>30?10:30));
		        			 comandos.add(new ComandoIrA(i==7?10:7, Constantes.penalSup));	        			 
	        			 }
	        		 }
	        	  }
	          }                        
          }else{        	     
        	     if(disRematadorCentroArco<25){
        	    	 Posicion posRemate = Constantes.centroArcoSup;
        	    	 double distanciaMueveCentro =18-disRematadorCentroArco;
			          if(disArqRivalPosDer>disArqRivalPosIzq){
			        	  if(disRematadorCentroArco>8)
			        		  posRemate.moverPosicion(12-distanciaMueveCentro, 12- distanciaMueveCentro);
			        	  else
			        		  posRemate=Constantes.posteDerArcoSup;			        	  
			        	  comandos.add(new ComandoGolpearBalon(i, posRemate, fuerzaRemateArco(disRematadorCentroArco), 
			        			  anguloRemateArco(disRematadorCentroArco)));			        	  
			          }else{
			        	  if(disRematadorCentroArco>10)
			        		  posRemate.moverPosicion(12-distanciaMueveCentro, 12-distanciaMueveCentro);
			        	  else
			        		  posRemate=Constantes.posteIzqArcoSup;
			        	  
			        	  comandos.add(new ComandoGolpearBalon(i, posRemate, fuerzaRemateArco(disRematadorCentroArco), anguloRemateArco(disRematadorCentroArco)));			        	  
			          }
        	     }else{
        	    	 Random r = new Random();
            	     double f = r.nextDouble() * 0.2 + 0.7;        	    	 
            	     comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, f, 35));
        	     }
        	     
          }
        }
        
        return comandos;

    }
    
    private double fuerzaRemateArco(double disRematadorCentroArco){    	
    	double fuerza = 0.8+(disRematadorCentroArco*0.01);        
    	return fuerza;
    	
    }
    private double anguloRemateArco(double disRematadorCentroArco){    	
    	double angulo = 35-(20-disRematadorCentroArco);    	
    	return angulo;
    }
    
    private double fuerzaPase(Posicion posJugadorHacePase, Posicion posJugadorPasan, String tipoPase){
    	double distanciaJugadores = posJugadorHacePase.distancia(posJugadorPasan);
    	double fuerza = 0;
    	if(tipoPase.equals("CORNER"))
    		fuerza = 0.7+(distanciaJugadores*0.01);
    	if(tipoPase.equals("A_ARMADOR"))
    		fuerza = 0.65+(distanciaJugadores*0.01);
    	if(tipoPase.equals("ATRAS"))
    		fuerza = 0.8+(distanciaJugadores*0.01);
    	fuerza = fuerza>1?1:fuerza;    	    	
    	return fuerza;
    	
    }
}